package SE;



/**
 * @className: Test2
 * @author: 芃
 * @description: 类和对象
 * @date: 2023/8/15 23:30
 */
class Person{
    //属性->成员变量 ->普通成员变量和静态成员变量
    //成员变量未赋值的时候为默认值 ->存在堆上
    //静态成员变量属于类对象 所有实例对象共享一份 存在方法区
    private String name;
    private int age;
    private String sex;
    public static int count;
    //行为
    public void sleep(){
        System.out.println("年龄为" + age + "的" + sex + "性" + name + "正在睡觉~");
    }
    //注意：1、静态方法内部不可以调用普通方法，因为普通方法需要实例化对象，而静态方法不需要实例化对象，非要调用的话需要在静态方法内部实例化对象
    //2、普通方法内部不可以定义静态变量，静态变量属于类，不属于对象
    //3、普通方法内部可以调用静态方法，因为静态方法属于类，不需要实例化操作也可以操作使用
    //4、引用不一定在栈上，取决于引用在哪里生成

    //getter setter 方法
    //this代指当前对象的引用
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    //构造方法 -> 带参数 不带参数（单个参数和多参数）
    //如果不实现任何构造方法，编译器会默认生成一个不带参数的构造方法，也就是说，一个类至少会有一个构造方法
    //如果实现了构造方法，编译器将不再默认生成不带参数的构造方法
    //构造方法可以构成重载
    public Person(String name, int age, String sex) {//带多个参数
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public Person(String name) {//带一个参数
        this.name = name;
    }
    public Person() {//自己定义的不带参数的构造方法
    }

    //※this详解：
    //1.this.data 调用当前对象的属性
    //2.this.func() 调用当前对象的方法
    //3.this() 调用当前对象的其他构造方法，只能在构造方法当中使用，普通方法不可以使用

    //代码块：
    //1、本地代码块
    //2、实例代码块-每次实例化对象都会执行，先于构造方法执行
    {
        System.out.println("实例代码块");
    }
    //3、静态代码块-只会被程序执行一次，不需要实例化对象也可以执行（类加载阶段处理）
    //如果都是静态的 和程序定义的顺序有关
    static {
        System.out.println("静态代码块");
    }
    //4、同步代码块
    //toString方法
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

public class Test2 {
    public static void main(String[] args) {
        //静态
        Person person = new Person("李四",28,"男");
    }
    public static void main1(String[] args) {
        Person person = new Person();
//        person.name = "张三";
//        person.age = 23;
//        person.sex = "男";
//        person.count++;
//        System.out.println(person.count);
//        person.sleep();
        Person person1 = new Person();
//        person1.count++;
//        System.out.println(person1.count);
    }
}
